import requests
from datetime import datetime
from config.Peizhi import Hc

# 从配置文件中导入 Hc 类并实例化，用于获取工作状态和振动相关的配置信息
hc = Hc()
# Django REST API 地址，用于推送故障信息
API_URL = "http://222.134.245.144:17000/weizhang/VioModel/"

# 定义一个函数，用于将故障信息推送到 REST API
def send_fault_to_api(fault_info):
    """推送故障信息到REST API"""
    try:
        # 发送 POST 请求，将故障信息以 JSON 格式发送到指定的 API 地址
        response = requests.post(API_URL, json=fault_info)
        if response.status_code == 201:
            # 如果请求成功（状态码为 201），打印成功推送的信息
            print(f"故障推送成功：{fault_info['gu_zhang_miao_shu']}")
        else:
            # 如果请求失败，打印失败信息，包含状态码和响应内容
            print(f"推送失败，状态码：{response.status_code}，响应：{response.text}")
    except requests.exceptions.RequestException as e:
        # 如果请求过程中出现异常，打印异常信息
        print(f"网络请求失败：{str(e)}")

# 定义一个函数，用于获取工作状态相关的配置信息
def get_gong_zuo():
    # 从配置文件中获取工作状态信息
    return hc.fw

# 定义一个函数，用于获取主泵和副泵的名称
def bengdata():
    # 保持原有逻辑不变
    # API 的 URL 地址
    url = "http://222.134.245.144:17000/chuanganqi/FieldConfigModel/"
    # 发送 GET 请求获取数据
    response = requests.get(url)
    if response.status_code == 200:
        # 如果请求成功，将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        # 用于存储泵名称的列表
        pump_names = []
        for result in results:
            # 获取主副泵相关数据
            zhufubeng_data = result.get("zhufubeng", [])
            for pump_info in zhufubeng_data:
                # 获取泵的类型（主泵或副泵）
                pump_type = pump_info["pump"]
                # 获取泵的名称
                pump_name = pump_info["name"]
                if pump_type == "主泵":
                    # 如果是主泵，将名称和类型组合添加到列表中
                    pump_names.append(f"{pump_name}-主泵")
                elif pump_type == "副泵":
                    # 如果是副泵，将名称和类型组合添加到列表中
                    pump_names.append(f"{pump_name}-副泵")
        # 如果列表中至少有两个元素，返回前两个元素，否则返回默认的未知名称
        return pump_names[:2] if len(pump_names) >= 2 else ["未知主泵", "未知副泵"]
    else:
        # 如果请求失败，打印失败信息并返回请求失败的名称
        print(f"请求失败，状态码: {response.status_code}")
        return ["请求失败主泵", "请求失败副泵"]

# 定义一个函数，用于获取主泵和副泵的工作状态
def get_status():
    # 保持原有逻辑不变
    # API 的 URL 地址
    url1 = "http://222.134.245.144:17000/chuanganqi/BopPanelModel/"
    # 发送 GET 请求获取数据
    response = requests.get(url1)
    if response.status_code == 200:
        # 如果请求成功，将响应内容转换为 JSON 格式
        data = response.json()
        # 获取结果列表
        results = data.get("results", [])
        # 获取最新的结果
        latest_result = results[-1]
        # 获取主泵和副泵的数据
        beng1 = latest_result.get("dian_beng_1")
        beng2 = latest_result.get("dian_beng_2")
        # 获取主泵和副泵的灯状态
        device_id1 = beng1.get("deng")
        device_id2 = beng2.get("deng")
        # 调用 bengdata 函数获取主泵和副泵的名称
        zhu, fu = bengdata()
        # 根据主泵名称确定主泵和副泵的状态并返回
        return {"主泵": device_id1 if zhu == "1#pump-主泵" else device_id2,
                "副泵": device_id2 if zhu == "1#pump-主泵" else device_id1}
    # 如果请求失败，返回默认的状态（都为 False）
    return {"主泵": False, "副泵": False}

# 定义一个函数，用于获取泵的振动信息
def get_vibration(pump_name):
    # 保持原有逻辑不变
    # 获取主泵和副泵的工作状态
    pump_main, pump_f = get_status().values()
    if "主泵" in pump_name:
        # 如果是主泵，从配置文件中获取主泵电机工作振动信息
        return {"zhu": hc.zb}
    elif "副泵" in pump_name:
        # 如果是副泵，从配置文件中获取副泵电机工作振动信息
        return {"fu": hc.fb}
    # 如果泵名称不符合要求，返回空字典
    return {}

# 定义一个函数，用于检查泵的缓冲装置、电机固定和泵动力端是否损坏
def huanchong():
    # 获取主泵和副泵的工作状态
    pump_status = get_status()
    # 获取非工作状态下的振动范围
    non_working_v1, non_working_v2 = get_gong_zuo()

    for pump_name, status in pump_status.items():
        if status:  # 泵正在工作
            # 获取泵的振动信息
            vibrations = get_vibration(pump_name)
            # 初始化故障标志为 False
            fault_flag = False
            for value in vibrations.values():
                # 处理单个数值或列表/元组类型的振动数据
                if isinstance(value, (list, tuple)):
                    for v in value:
                        # 判断振动值是否在正常范围内，如果不在则设置故障标志为 True
                        if not _is_vibration_normal(v, non_working_v1, non_working_v2):
                            fault_flag = True
                else:
                    # 判断振动值是否在正常范围内，如果不在则设置故障标志为 True
                    if not _is_vibration_normal(value, non_working_v1, non_working_v2):
                        fault_flag = True

            if fault_flag:
                # 如果故障标志为 True，打印故障信息
                print(f"{pump_name} 排出端缓冲装置损坏、电机固定松动、泵动力端损坏。")
                # 构造故障信息并推送
                fault_info = {
                    "gu_zhang_ming_cheng": "泵组综合故障",
                    "she_bei_ming_cheng": pump_name,
                    "she_bei_qu_yu": "泵组",
                    "gu_zhang_shi_jian": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
                    "gu_zhang_lei_xing": "振动异常",
                    "shi_ji_zhi": 5.0,  # 转换为字符串存储复合数据
                    "gao_jing_zhi": 5,  # 正常范围
                    "gu_zhang_miao_shu": f"{pump_name} 振动值异常，超出正常范围[{non_working_v1}, {non_working_v2}]",
                    "chu_li_zhuang_tai": "未处理"
                }
                send_fault_to_api(fault_info)
            else:
                # 如果故障标志为 False，打印正常信息
                print(f"{pump_name} 没有问题")

# 定义一个函数，用于判断振动值是否在正常范围内
def _is_vibration_normal(value, min_normal, max_normal):
    """判断振动值是否在正常范围内"""
    # 判断振动值是否在最小和最大正常范围之间
    return min_normal <= value <= max_normal

# 调用 huanchong 函数进行检查
huanchong()